
package hc.trip.airticket.result;

import hc.trip.airticket.bean.FlightInfo;
import hc.trip.airticket.bean.PriceInfo;
import hc.trip.airticket.bean.QueryInfo;
import hc.trip.airticket.bean.ResultInfo;
import hc.trip.airticket.constant.StaticParameter;
import hc.trip.airticket.httpclient.HttpRequestProxy;
import org.apache.commons.httpclient.ConnectTimeoutException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 0707
 * @date 2011-3-2
 * @description ：山东航空获取responseText并分析
 */
public class GetFlightListSC {

	/**
	 * 根据航班的查询条件（出发城市、到达城市、时间）请求并分析得到结果集合
	 * @param queryInfo
	 * @return
	 * @throws Exception
	 */
		public ResultInfo getResultInfo(QueryInfo queryInfo){
			
			String responseText = "";
			ResultInfo resultInfo = null;
			//查询条件不合法
			if(queryInfo==null||queryInfo.getDateString()==null||queryInfo.getDateString().length()<=0||queryInfo.getDesCity()==null||queryInfo.getDesCity().length()<=0||queryInfo.getOrgCity()==null||queryInfo.getOrgCity().length()<=0){
				return null;
			}
			
			HttpRequestProxy proxy = new HttpRequestProxy();
			Map postData   = new HashMap();
			Map header     = new HashMap();
			
			//请求头部
			header.put("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 1.7; .NET CLR 1.1.4322; CIBA; .NET CLR 2.0.50727)");
		    header.put("Host", "sc.travelsky.com");
		    header.put("Referer", "http://www.shandongair.com.cn/iframe/jpyd.html");
 
			//使用POST请求，赋值post数据
			postData.put("countrytype", "0");  //0：国内         1：国际、两岸、地区航线
			postData.put("cityCodeOrg", queryInfo.getOrgCity());  //出发机场
			postData.put("cityCodeDes", queryInfo.getDesCity());  //到达机场
			postData.put("takeoffDate", queryInfo.getDateString());  //出发日期
			postData.put("nextday", "");   
			postData.put("step", "0");   
			postData.put("travelType", "0");    //0:单程  1:往返 
			postData.put("usefor", "1");  
			postData.put("x", "56");  
			postData.put("y", "6");   
			postData.put("returnDate", "");     //返程日期
 
	        try {
	        	//返回的HTML
				responseText = proxy.doRequest(
		 	    "http://sc.travelsky.com/scet/queryAv.do?lan=cn", postData, header,"GBK");
				resultInfo = (ResultInfo)analyzeResopnseText(responseText);
	 
			}catch (ConnectTimeoutException e) {   //超时
				// TODO: handle exception
				if (resultInfo==null) {
					resultInfo = new ResultInfo();
				}
				resultInfo.setStatus(StaticParameter.analyzeStatusTimeOut);   
				e.printStackTrace();
			} 
	        catch (Exception e) {                //其他异常
				// TODO: handle exception
				if (resultInfo==null) {
					resultInfo = new ResultInfo();
				}
				resultInfo.setStatus(StaticParameter.analyzeStatusError);
				e.printStackTrace();
			}
	
	          	return resultInfo;
			 
		}
		
		
		/**
		 * 根据山东航空网站返回的responseText通过正则表达式分析出结果
		 * @param source  返回的responseText
		 * @return        结果列表 
		 * @throws Exception 
		 */
		public ResultInfo analyzeResopnseText(String source) throws Exception{
		      PriceInfo priceInfo = null;
		      List priceList  =  null;
		      ResultInfo resultInfo = new ResultInfo();  //结果对象

		      if (source==null||source.trim().length()==0) {
				return null;
			}
	 
	 		  String[] parts = source.split("<td\\s*class=\"bkg\"><table width=\"\\d{1,3}\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" class=\"flow0_chaxun_tab.*?\">"); //将每一个航班区分开来
			  //System.out.println(source);
	 		  if (parts.length==0) {     //没有航班信息
				System.out.println("山东航空没有相应航班信息------------------------------");
				return null;
			}
 
			     ArrayList<FlightInfo> flightInfos = new ArrayList<FlightInfo>();  //存放所有的航班信息
			     

			     StringBuffer regexSB = new StringBuffer();  //匹配航班信息
			     regexSB.append("<img src=\"/scet/imagesTicket/chaxun_logo.gif\" align=\"absmiddle\" />\\s*<br />\\s*");
			     regexSB.append("<span class=\"sc\">(.*?)</span></td>\\s*");  //航班号 & 代码共享
			      regexSB.append("<td width=\"60\">(.*?)<br\\s*/>(.*?)</td>\\s*");  //起飞时间&降落时间
			      regexSB.append("<td width=\"35\">\\s*<span class=\"flow0_chaxun_tab06_list03\">(.*?)</span>");  //机型
			     
			     regexSB.append(".*?<td width=\"49\" align=\"center\">(.*?)</td>");  //是否经停

			     //航班号  ，航班号+代码共享 ，出发时间，降落时间。
			     String regex =regexSB.toString();
			     String priceRegex = "";

			     priceRegex = "<input\\s*type=\"hidden\"\\s*name=\"select0\"\\s*value=\"(.*?)\" >";
			     Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
			     Pattern pPrice = Pattern.compile(priceRegex,Pattern.CASE_INSENSITIVE);

			     FlightInfo tempInfo = null;
			     double  tempMinPriceForAll = 0.0;  //所有航班的最低价格
			     double  tempMaxPriceForAll = 0.0;  //所有航班的最高价格
			     boolean tempIsFirstForAll = true;
			     //依次取出每个航班的信息,因为parts[0]中没有航班信息，所以数组下标从1开始
 		     	 for(int j=1;j<parts.length;j++){
 				 priceList  =  new ArrayList();
 				 tempInfo =new FlightInfo();
			     Matcher matcher = p.matcher(parts[j]);
			     if(matcher.find())   //匹配航班信息
			     {	    	 
 
			    	 //String flightNo = matcher.group(1).trim();
			    	 String flightNoAndShareCode = matcher.group(1).trim();
			    	// tempInfo.setFlightNo(flightNo);  //航班号
			    	//判断是否是代码共享
			    	 
			    	 if (flightNoAndShareCode!=null&&flightNoAndShareCode.length()>0) {
				    	 
			    		 if (flightNoAndShareCode.trim().length()<=10) {
			    			tempInfo.setFlightNo(flightNoAndShareCode.trim());		    			 
						}else {
					 
				    		 String regexTemp = "(.*?)<img src=\"/scet/images/icon_codeshare.gif\" width=\"15\" height=\"14\" border=\"0\" alt=\"(.*?)\">";
				    		 Pattern pTemp = Pattern.compile(regexTemp);
				    		 Matcher maTemp  = pTemp.matcher(flightNoAndShareCode);
				    		 if(maTemp.find()){   //如果匹配成功，则为代码共享航班
				    			 tempInfo.setShareCodeFlag(true);
				    			 tempInfo.setShareCode(maTemp.group(2).toString()); 
				    			 tempInfo.setFlightNo(maTemp.group(1).trim());
				    		 }
			    	 }
					}else {
						System.out.println("山东航空，没有匹配到航班号。。。。。。。。。。。");
					}
 
			    	 //判断代码共享结束
			    	 tempInfo.setTakeOffTime(matcher.group(2).trim());
			    	 tempInfo.setArriveTime(matcher.group(3).trim());
			    	 tempInfo.setPlaneType(matcher.group(4).trim());
			    	 if (matcher.group(5).trim().equals("有")) {
						tempInfo.setStopOver(true);
					}
			     }else {
					if (j==1) {
                        System.out.println("山东航空分析失败。。。。");
						return null;
					}
				}
			    	 //分析价格start
			    	 Matcher mPrice = pPrice.matcher(parts[j]);
			    	 double tempMinPrice = 0.0;
			    	 double tempMaxPrice = 0.0;
			    	 boolean isFirst = true;
			    	 while(mPrice.find()){
			    	  String tempString  =  mPrice.group(1);
			    	  if (tempString==null||tempString.trim().length()<=0) {
						break;     //没有匹配到价格的那个value
					}
                     String[] tempArrString = tempString.trim().split("\\{");
			    	//长度必须为4，内容分别如下
                   //"SC,1341,PEK,WUH,2,2011-03-03 21:00,2011-03-03 23:10,320,1,1,1,1,0{
                   //DISCOUNT@经济舱@Q@A@0@@Q|650.0|60|不得签转 限网上退票|1|1|-1|10|10||1|Y|1080.0|620.0|620.0|||0|0|5|5|-|0|0||Days|Days|1|1@0@0{
                   //620{
                   //同舱同价改期首次免费，再次10%，退票10%，不得签转，限网上退票
                     if (tempArrString==null||tempArrString.length!=4) {  
						throw new Exception("山东航空，分析价格时，取得的value格式不正确");
					}
                     priceInfo = new PriceInfo();
                      
                  if (tempArrString[1]!=null&&tempArrString[1].trim().length()>0) {  //匹配舱位
                	  String price1Regex = ".*?@.*?@(\\w+?).*?";
                      Pattern prcie1Pattern  =Pattern.compile(price1Regex);
                      Matcher price1Matcher =  prcie1Pattern.matcher(tempArrString[1].trim());
                      if (price1Matcher.find()) {
                    	  priceInfo.setSpace(price1Matcher.group(1).trim());  //舱位
					}
				}
                  if (tempArrString[2]!=null&&tempArrString[2].trim().length()>0) {
                	try {
                		 priceInfo.setPrice(Double.parseDouble(tempArrString[2].trim()));  //价格
					} catch (Exception e) {
						e.printStackTrace();
						throw new Exception("山东航空获取价格不是数字");
						// TODO: handle exception
					}  
				}
                  if (tempArrString[3]!=null&&tempArrString[3].trim().length()>0){
                	  priceInfo.setRemind(tempArrString[3].trim());        //提示
                  }  
 
                        //遍历之前的舱位，看是否有相同的舱位，如果有现在的价格更低，则将之前的删除
                         boolean needAdd = true;    //是否需要将新的priceInfo加到list中
                         if (priceList!=null&&priceList.size()>=1) {
							Iterator it = priceList.iterator();
							PriceInfo info  = null;
							while (it.hasNext()) {
								info = (PriceInfo)it.next();
								if (info.getSpace().equals(priceInfo.getSpace())) {
									if (info.getPrice()>priceInfo.getPrice()) {
										priceList.remove(info);
										break;
									}else {
										needAdd = false;	
									}
								}	
							}
							
						} 
                  if (needAdd) {
                	  priceList.add(priceInfo);
				}
				    	  
				    	  
				    	  //一个航班不同cabin的最低和最高价格获取
				    	  if (isFirst) {
				    		  tempMinPrice = priceInfo.getPrice();
				    		  tempMaxPrice = priceInfo.getPrice();
				    		  tempInfo.setMinprice(tempMinPrice);
				    		  tempInfo.setMaxprice(tempMaxPrice);
				    		  isFirst = false;
						}
				    	 
						     if (tempMinPrice>priceInfo.getPrice()) {   //如果一个航班的tempMinPrice不是最低价格
						    	 tempMinPrice = priceInfo.getPrice();
								}
						     if (tempMaxPrice<priceInfo.getPrice()) {   //如果一个航班的tempMaxPrice不是最高价格
						    	 tempMaxPrice = priceInfo.getPrice(); 
							}
						     tempInfo.setMaxprice(tempMaxPrice);
						     tempInfo.setMinprice(tempMinPrice);
			    	 }
			     tempInfo.setPrice(priceList);
			     flightInfos.add(tempInfo);
			     
			     //在每一个航班的循环内，取得目前航班中的最低价格和最高价格
			     if (tempIsFirstForAll) {      //初始值
			    	 tempMinPriceForAll = tempInfo.getMinprice();
			    	 tempMaxPriceForAll = tempInfo.getMaxprice();
			    	 tempIsFirstForAll  = false;
				}
			     if (tempMinPriceForAll>tempInfo.getMinprice()) {   
 
			    	 tempMinPriceForAll = tempInfo.getMinprice();
				}
			     if (tempMaxPriceForAll<tempInfo.getMaxprice()) {
				 
			    	 tempMaxPriceForAll = tempInfo.getMaxprice();
				}
		    	 resultInfo.setMinPriceFlight(tempMinPriceForAll);
		    	 resultInfo.setMaxPriceFlight(tempMaxPriceForAll);
			     
 		     	 }
 		    resultInfo.setResultList(flightInfos);	  
 		 	 
			return resultInfo;
		}


}
